package com.igeek.string;

/**
 * 字符串：
 *      1.特点：字符串是不可变
 *      2.字符串的比较 不用 == 而是使用 equals()，原因就是 == 比较的是地址；equals() 比较的是 内容具体的值
 */
public class Demo01 {

    public static void main(String[] args) {

        String str1 = "hello";

        String str2 = new String("hello");

        /*
            false
                str1指向的是，常量池中的一块区域
                str2指向的是，堆中的一块区域
         */
        System.out.println(str1 == str2);

        /*
            true
                equals() 比较的是两个值的内容
         */
        System.out.println(str1.equals(str2));

        String str3 = new String("hello");

        /*
            false
                str2是一个对象，str3也是一个对象，分别指向堆中的不同区域
         */
        System.out.println(str2 == str3);

        /*
            str2 与 str3 是不同的对象，但是他们的hashcode一样
            原因：Java底层做了更改，将equals() 方法比对的结果为true时，改为一致的
         */
        System.out.println(str2.hashCode() + "---"+str3.hashCode());

        String s1 = "hello ";
        String s2 = "world ";
        String str4 = s1 + s2;

        String str5 = "hello world";

        /*
            false
                str4 做了字符串的拼接，实质是使用StringBuffer 对象，将两个字符串进行拼接 append()
                str5 是常量池中的一个区域
         */
        System.out.println(str4 == str5);


        /*
            false
                str4 字符串的拼接使用了StringBuffer 对象，指向的是堆中的区域
                str6 常量池中的地址
         */
        String str6 = "hello "+ "world";
        System.out.println(str4 == str6);

        /*
            true
                str6 常量池中的地址
                str5 常量池中的地址
         */
        System.out.println(str5 == str6);

    }

}
